package es.mfp.practicos.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import es.mfp.practicos.dao.FacturaDAO;
import es.mfp.practicos.domain.ConsumoPuntos;
import es.mfp.practicos.domain.Empleado;
import es.mfp.practicos.domain.Factura;
import es.mfp.practicos.domain.LineaFactura;

@Component("facturasService")
public class FacturaServiceImpl implements FacturasService {

	@Autowired
	private FacturaDAO dao;

	@Autowired
	private EmpleadoService empleadoService;

	public void setDao(FacturaDAO dao) {
		this.dao = dao;
	}

	@Override
	public List<Factura> getFacturas() {
		return dao.getAll();
	}

	@Transactional(readOnly = false)
	@Override
	public void insertar(Factura factura) {

		factura.setFechaAlta(new Date());

		this.dao.insert(factura);

		if (factura.getLineas() != null) {
			for (LineaFactura lf : factura.getLineas()) {

				if (lf.getLineaTelefonica() == null) {
					throw new IllegalStateException(
							"Se ha hallado una linea de factura sin lina telefonica asociada");
				}

				Empleado e = lf.getLineaTelefonica().getTitular();
				e = empleadoService.buscarPorId(e.getId());

				ConsumoPuntos cp = ConsumoPuntos.build(lf);
				e.addConsumo(cp);

				empleadoService.guardar(e);
			}
		}

	}

	@Override
	public Factura buscarPorId(Long idFacura) {
		return dao.findByPK(idFacura);
	}

	@Override
	public List<Factura> getFacturasActivas() {
		return dao.findActivas();
	}

	@Override
	public List<Date> buscarFechasDesde() {
		return dao.findFechasDesde();
	}

	@Override
	public List<Date> buscarFechasHasta() {
		return dao.findFechasHasta();
	}

	@Override
	public void guardar(Factura factura) {

		dao.update(factura);

		factura = dao.findByPK(factura.getId());

		for (LineaFactura lf : factura.getLineas()) {

			Empleado e = lf.getLineaTelefonica().getTitular();

			e = empleadoService.buscarPorId(e.getId());

			if (!contieneApunteConsumo(e, lf)) {

				ConsumoPuntos cp = ConsumoPuntos.build(lf);
				e.addConsumo(cp);

				empleadoService.guardar(e);
			}

		}

	}

	private boolean contieneApunteConsumo(Empleado e, LineaFactura lf) {
		if (e.getConsumos() == null || e.getConsumos().isEmpty()) {
			return false;
		}

		for (ConsumoPuntos cc : e.getConsumos()) {
			if (cc.getLineaFactura() != null && cc.getLineaFactura().equals(lf)) {
				return true;
			}
		}

		return false;
	}

}
